Python将多个单波段tif合并为一个影像

30 篇文章 20 订阅
  • 将同一文件夹里的多个tif合并为一个tif或dat或其他的影像文件
  • 输入影像的行列数投影应保持一致
  • dat格式可以给波段命名,tif格式看不到波段名称
# -*- coding:utf-8 -*-
import numpy as np
import gdal
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')

#修改路径
tifDir = r"D:\data\testmerge"  #tif路径 单波段
outtif = r"D:\data\testmerge\result\out1.dat"


NP2GDAL_CONVERSION = {
  "uint8": 1,
  "int8": 1,
  "uint16": 2,
  "int16": 3,
  "uint32": 4,
  "int32": 5,
  "float32": 6,
  "float64": 7,
  "complex64": 10,
  "complex128": 11,
}
tifs = [i for i in os.listdir(tifDir) if i.endswith(".tif")]
#获取投影波段数等信息
bandsNum = len(tifs)
dataset = gdal.Open(os.path.join(tifDir,tifs[0]))
projinfo = dataset.GetProjection()
geotransform = dataset.GetGeoTransform()
cols,rows=dataset.RasterXSize,dataset.RasterYSize
datatype=dataset.GetRasterBand(1).ReadAsArray(0,0,1,1).dtype.name
gdaltype=NP2GDAL_CONVERSION[datatype]
dataset=None
#创建目标文件
format = "GTiff" #tif格式
format = "ENVI"  # ENVI格式
driver = gdal.GetDriverByName(format)
dst_ds = driver.Create(outtif,cols, rows,bandsNum, gdaltype)
dst_ds.SetGeoTransform(geotransform)
dst_ds.SetProjection(projinfo)
#写入文件
info = set()
for k in range(bandsNum):
    ds = gdal.Open(os.path.join(tifDir,tifs[k]))
    X,Y = ds.RasterXSize,ds.RasterYSize
    info.add("%s,%s"%(X,Y))
    if(len(info) != 1):
        dst_ds = None
        ds = None
        print("%s 列数行数不一样:%s,%s"%(tifs[k],X,Y))
        raise Exception("有影像行列数不一致")
    data = ds.GetRasterBand(1).ReadAsArray()    ##读取第一波段
    ds = None
    dst_ds.GetRasterBand(k+1).WriteArray(data)
    dst_ds.GetRasterBand(k+1).SetDescription("hahha_%s"%k)
    print("波段 %s ==> 文件 %s"%(k+1,tifs[k]))
dst_ds = None
好的,以下是将一个文件夹下的所有tif影像波段32位转为波段24位的Python程序,同样需要使用到Pillow库: ```python from PIL import Image import os # 定义函数将tif影像转为24位波段影像 def convert_tif(input_path, output_path): # 打开32位波段tif影像 im = Image.open(input_path) # 转为24位波段影像 im = im.convert('RGB') # 保存为新的tif影像 im.save(output_path) # 定义函数批量转换文件夹下的所有tif影像 def batch_convert_tif(input_folder, output_folder): # 遍历文件夹下的所有tif影像 for filename in os.listdir(input_folder): # 判断是否为tif文件 if filename.endswith('.tif'): # 构建输入和输出路径 input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, filename) # 调用转换函数 convert_tif(input_path, output_path) # 调用批量转换函数 batch_convert_tif('input_folder', 'output_folder') ``` 在这个程序中,我们首先定义了一个`convert_tif()`函数,用于将tif影像转为24位波段影像。然后我们定义了一个`batch_convert_tif()`函数,用于批量转换文件夹下的所有tif影像。在`batch_convert_tif()`函数中,我们使用`os.listdir()`函数遍历文件夹下的所有tif影像,并调用`convert_tif()`函数将其转为24位波段影像。最后,我们调用`batch_convert_tif()`函数,传入输入和输出文件夹的路径,即可批量转换文件夹下的所有tif影像
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独孤尚亮dugushangliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值